/*
 * @Author: your name
 * @Date: 2024-03-25 11:20:06
 * @LastEditTime: 2024-03-25 11:54:07
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \.leetcode\209.长度最小的子数组.cpp
 */
/*
 * @lc app=leetcode.cn id=209 lang=cpp
 *
 * [209] 长度最小的子数组
 */

// @lc code=start
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
       int len = nums.size();
       int left = 0, right = 0;
       int sum = 0;
       int subLength = 0;
       int result = INT32_MAX;
       for( right = 0; right < len; right++){
            sum += nums[right];
             // 注意这里使用while，每次更新 i（起始位置），并不断比较子序列是否符合条件
             while(sum >= target){
                subLength = (right - left + 1); // 取子序列的长度
                result = result < subLength ? result : subLength;
                sum -= nums[left++]; // 这里体现出滑动窗口的精髓之处，不断变更i（子序列的起始位置）
             }
       }
        // 如果result没有被赋值的话，就返回0，说明没有符合条件的子序列
        return result == INT32_MAX ? 0 : result;
    }
};
// @lc code=end
// 滑窗法（双指针法）
